package cn.getech.data.development.utils;

import cn.getech.data.development.config.properties.DataDevelopmentConfig;
import cn.getech.data.development.config.properties.SendEMailConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Map;

@Slf4j
@Component
public class SendEMailUtil {

    @Autowired
    private SendEMailConfig sendEMailConfig;


    @Value("${mail.mailHost:mail.tcl.com}")
    private String mailHost;

    @Value("${mail.mailFrom:getech_dip_test@tcl.com}")
    private String mailFrom;

    @Value("${mail.mailFromPwd:getech@1234}")
    private String mailFromPwd;

    public void createSimpleMail(String mailTo, String mailTittle, String mailText) throws Exception {
        log.info("接收邮箱 mailTo:{}, mailTitle:{}, mailText:{}", mailTo, mailTittle, mailText);
        try {
            // 使用JavaMail发送邮件的5个步骤
            // 1、创建session
            Session session = Session.getInstance(sendEMailConfig.configs());
            // 开启Session的debug模式，可以查看到程序发送Email的运行状态
            session.setDebug(false);
            // 2、通过session得到transport对象
            Transport ts = session.getTransport();
            // 3、使用邮箱的用户名和密码连上邮件服务器，发送邮件时，发件人需要提交邮箱的用户名和密码给smtp服务器，用户名和密码都通过验证之后才能够正常发送邮件给收件人。
            ts.connect(mailHost, mailFrom, mailFromPwd);
            // 4、创建邮件
            // 创建邮件对象
            MimeMessage message = new MimeMessage(session);
            // 指明邮件的发件人
            message.setFrom(new InternetAddress(mailFrom));
            // 指明邮件的收件人，现在发件人和收件人是一样的，那就是自己给自己发
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(mailTo));
            // 邮件的标题
            message.setSubject(mailTittle,"UTF-8");
            // 邮件的文本内容
            message.setContent(mailText, "text/html;charset=UTF-8");
            // 5、发送邮件
            ts.sendMessage(message, message.getAllRecipients());
            ts.close();
        }catch (Exception e){
            e.printStackTrace();
            log.error("JavaMail发送邮件失败 {}", e.getMessage());
            throw new Exception(e);
        }


    }


    public void createMultipartMail(String mailTo, String mailTittle, Map<String,Object> paramsData) throws Exception {
        log.info("接收邮箱 mailTo:{}, mailTitle:{}, paramsData:{}", mailTo, mailTittle, paramsData);
        try {
            // 使用JavaMail发送邮件的5个步骤
            // 1、创建session
            Session session = Session.getInstance(sendEMailConfig.configs());
            // 开启Session的debug模式，可以查看到程序发送Email的运行状态
            session.setDebug(false);
            // 2、通过session得到transport对象
            Transport ts = session.getTransport();
            // 3、使用邮箱的用户名和密码连上邮件服务器，发送邮件时，发件人需要提交邮箱的用户名和密码给smtp服务器，用户名和密码都通过验证之后才能够正常发送邮件给收件人。
            ts.connect(mailHost, mailFrom, mailFromPwd);
            // 4、创建邮件
            // 创建邮件对象
            MimeMessage message = new MimeMessage(session);
            // 指明邮件的发件人
            message.setFrom(new InternetAddress(mailFrom));
            // 指明邮件的收件人，现在发件人和收件人是一样的，那就是自己给自己发
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(mailTo));
            // 邮件的标题
            message.setSubject(mailTittle);
            // 创建消息部分
            BodyPart messageBodyPart = new MimeBodyPart();
            Object msg = paramsData.get("msg");
            Object filename = paramsData.get("filename");
            // 消息
            messageBodyPart.setText(null != msg ? msg.toString() : "");

            // 创建多重消息
            Multipart multipart = new MimeMultipart();

            // 设置文本消息部分
            multipart.addBodyPart(messageBodyPart);

            // 附件部分
            if(null != filename){
                messageBodyPart = new MimeBodyPart();
                // 设置要发送附件的文件路径
                DataSource source = new FileDataSource(filename.toString());
                messageBodyPart.setDataHandler(new DataHandler(source));
                // 处理附件名称中文（附带文件路径）乱码问题
                messageBodyPart.setFileName(MimeUtility.encodeText(filename.toString()));
                multipart.addBodyPart(messageBodyPart);
            }

            // 发送完整消息
            message.setContent(multipart);

            // 5、发送邮件
            ts.sendMessage(message, message.getAllRecipients());
            ts.close();
        }catch (Exception e){
            e.printStackTrace();
            log.error("JavaMail发送邮件失败 {}", e.getMessage());
            throw new Exception(e);
        }


    }
}
